package org.zhiyootech.base.jwt;

import org.eclipse.microprofile.jwt.Claims;
import org.zhiyootech.base.domain.BaseRequest;
import org.zhiyootech.utils.TokenUtils;

import javax.enterprise.context.ApplicationScoped;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@ApplicationScoped
public class GenerateToken {

    /**
     * iss(Issuser)：代表这个JWT的签发主体；
     * sub(Subject)：代表这个JWT的主体，即它的所有人；
     * aud(Audience)：代表这个JWT的接收对象；
     * exp(Expiration time)：是一个时间戳，代表这个JWT的过期时间；
     * nbf(Not Before)：是一个时间戳，代表这个JWT生效的开始时间，意味着在这个时间之前验证JWT是会失败的；
     * iat(Issued at)：是一个时间戳，代表这个JWT的签发时间；
     * jti(JWT ID)：是JWT的唯一标识。
     *
     * @return
     * @throws Exception
     */
    public BaseRequest.Token generateTokenByUserInfo(String nickName) throws Exception {
        Map<String, Object> res = new HashMap<>();
        res.put("iss", "https://quarkus.io/using-jwt-rbac");
        res.put("jti", "a-123");
        res.put("sub", "jdoe-using-jwt-rbac");
        res.put("upn", "jdoe@quarkus.io");
        res.put("preferred_username", nickName);
        res.put("aud", "using-jwt-rbac");
        res.put("userName", nickName);
        List<String> groups = new ArrayList<>();
        groups.add("Dev");
        groups.add("Merchant");
        groups.add("Member");
        groups.add("Tourist");
        res.put("groups", groups);
        HashMap<String, Long> timeClaims = new HashMap<>();
        long expire = TokenUtils.currentTimeInSecs() + 3600L;
        timeClaims.put(Claims.exp.name(), expire);
        String tokenString = TokenUtils.generateTokenString(res, timeClaims);
        return BaseRequest.Token.builder()
                .token(tokenString)
                .expire(expire)
                .build();
    }



    public BaseRequest.Token generateTokenByUserInfoTourist(String nickName) throws Exception {
        Map<String, Object> res = new HashMap<>();
        res.put("iss", "https://quarkus.io/using-jwt-rbac");
        res.put("jti", "a-123");
        res.put("sub", "jdoe-using-jwt-rbac");
        res.put("upn", "jdoe@quarkus.io");
        res.put("preferred_username", nickName);
        res.put("aud", "using-jwt-rbac");
        res.put("userName", nickName);
        List<String> groups = new ArrayList<>();
        groups.add("Member");
        groups.add("Tourist");
        res.put("groups", groups);
        HashMap<String, Long> timeClaims = new HashMap<>();
        long expire = TokenUtils.currentTimeInSecs() + 3600L;
        timeClaims.put(Claims.exp.name(), expire);
        String tokenString = TokenUtils.generateTokenString(res, timeClaims);
        return BaseRequest.Token.builder()
                .token(tokenString)
                .expire(expire)
                .build();
    }

}
